class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        // dp[i][j][k] 表示：从前 i 个字符串中挑选，字符 0 的个数不超过 j ,
        // 字符 1 的个数不超过 k ，所有的选法中，最大的长度
        int len = strs.size();
        vector<vector<vector<int>>> dp(len + 1, vector<vector<int>>(m + 1, vector<int>(n + 1, 0)));
        for(int i = 1; i <= len; ++i)
        {
            int a = 0, b = 0;
            for(auto& e : strs[i - 1]) // 统计0和1的个数
            {
                if(e == '0')
                    ++a;    
                else
                    ++b;
            }
            for(int j = 0; j <= m; ++j)
            {
                for(int k = 0; k <= n; ++k)
                {
                    if(j >= a && k >= b)
                        dp[i][j][k] = max(dp[i - 1][j][k], dp[i - 1][j - a][k - b] + 1) ;
                    else
                        dp[i][j][k] = dp[i - 1][j][k];
                }
            }
        }
        return dp[len][m][n];
    }
};